
/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#ifndef _NGX_HTTP_SSI_FILTER_H_INCLUDED_
#define _NGX_HTTP_SSI_FILTER_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


#define NGX_HTTP_SSI_MAX_PARAMS 16

#define NGX_HTTP_SSI_COMMAND_LEN 32
#define NGX_HTTP_SSI_PARAM_LEN   32
#define NGX_HTTP_SSI_PARAMS_N    4


#define NGX_HTTP_SSI_COND_IF   1
#define NGX_HTTP_SSI_COND_ELSE 2


#define NGX_HTTP_SSI_NO_ENCODING     0
#define NGX_HTTP_SSI_URL_ENCODING    1
#define NGX_HTTP_SSI_ENTITY_ENCODING 2


typedef struct
{
    ngx_hash_t             hash;
    ngx_hash_keys_arrays_t commands;
} ngx_http_ssi_main_conf_t;


typedef struct
{
    ngx_buf_t *buf;

    u_char *pos;
    u_char *copy_start;
    u_char *copy_end;

    ngx_uint_t       key;
    ngx_str_t        command;
    ngx_array_t      params;
    ngx_table_elt_t *param;
    ngx_table_elt_t  params_array[NGX_HTTP_SSI_PARAMS_N];

    ngx_chain_t  *in;
    ngx_chain_t  *out;
    ngx_chain_t **last_out;
    ngx_chain_t  *busy;
    ngx_chain_t  *free;

    ngx_uint_t state;
    ngx_uint_t saved_state;
    size_t     saved;
    size_t     looked;

    size_t value_len;

    ngx_list_t  *variables;
    ngx_array_t *blocks;

#if (NGX_PCRE)
    ngx_uint_t ncaptures;
    int       *captures;
    u_char    *captures_data;
#endif

    unsigned conditional   : 2;
    unsigned encoding      : 2;
    unsigned block         : 1;
    unsigned output        : 1;
    unsigned output_chosen : 1;

    ngx_http_request_t *wait;
    void               *value_buf;
    ngx_str_t           timefmt;
    ngx_str_t           errmsg;
} ngx_http_ssi_ctx_t;


typedef ngx_int_t (*ngx_http_ssi_command_pt)(ngx_http_request_t *r,
                                             ngx_http_ssi_ctx_t *ctx,
                                             ngx_str_t **);


typedef struct
{
    ngx_str_t  name;
    ngx_uint_t index;

    unsigned mandatory : 1;
    unsigned multiple  : 1;
} ngx_http_ssi_param_t;


typedef struct
{
    ngx_str_t               name;
    ngx_http_ssi_command_pt handler;
    ngx_http_ssi_param_t   *params;

    unsigned conditional : 2;
    unsigned block       : 1;
    unsigned flush       : 1;
} ngx_http_ssi_command_t;


extern ngx_module_t ngx_http_ssi_filter_module;


#endif /* _NGX_HTTP_SSI_FILTER_H_INCLUDED_ */
